home *** CD-ROM | disk | FTP | other *** search
/ Sun Solutions 1997 April to September / Sun Solutions CD - APR '97 - SEP '97 (704-3778-12 Rev. H)(Sun Microsystems, Inc.)(1997).iso / products / bin / httpd / src / http_alias.c < prev    next >
C/C++ Source or Header  |  1995-05-18  |  3KB  |  139 lines

  1. /*
  2.  * http_alias.c: Stuff for dealing with directory aliases
  3.  * 
  4.  * All code contained herein is covered by the Copyright as distributed
  5.  * in the README file in the main directory of the distribution of 
  6.  * NCSA HTTPD.
  7.  *
  8.  * Based on NCSA HTTPd 1.3 by Rob McCool
  9.  * 
  10.  *  04-06-95 blong
  11.  *     Added Saved_ variables to allow reset of aliases to configured 
  12.  *    only.  save_aliases is called from http_config, and 
  13.  *    reset_to_saved_alias is called in the initialization of 
  14.  *    transactions.
  15.  */
  16.  
  17.  
  18. #include "httpd.h"
  19.  
  20. typedef struct {
  21.     char fake[MAX_STRING_LEN];
  22.     char real[MAX_STRING_LEN];
  23.     int script;
  24. } alias;
  25.  
  26. static int Saved_num_alias = 0;
  27. static int num_a = 0;
  28. static alias a[MAX_ALIASES];
  29. static int Saved_num_redirect = 0;
  30. static int num_v = 0;
  31. static alias v[MAX_ALIASES];
  32.  
  33. /* To send stat() information to http_script.c */
  34. int dirs_in_alias;
  35.  
  36. void reset_aliases() {
  37.     num_a = 0;
  38.     num_v = 0;
  39. }
  40.  
  41. void save_aliases() {
  42.     Saved_num_alias = num_a;
  43.     Saved_num_redirect = num_v;
  44. }
  45.  
  46. void reset_to_saved_aliases() {
  47.     num_a = Saved_num_alias;
  48.     num_v = Saved_num_redirect;
  49. }
  50.  
  51. void add_alias(char *f, char *r, int is_script) {
  52.     if (num_a >= MAX_ALIASES)
  53.       num_a = Saved_num_alias;
  54.     strcpy(a[num_a].fake,f);
  55.  
  56.     a[num_a].script = is_script;
  57.     if(r[0] != '/') 
  58.         make_full_path((is_script ? server_root : document_root),r,
  59.                        a[num_a++].real);
  60.     else
  61.         strcpy(a[num_a++].real,r);
  62. }
  63.  
  64. void add_redirect(char *f, char *url) {
  65.     if (num_v >= MAX_ALIASES)
  66.       num_v = Saved_num_redirect;
  67.     strcpy(v[num_v].fake,f);
  68.     strcpy(v[num_v++].real,url);
  69. }
  70.  
  71. char fake[MAX_STRING_LEN + 2],real[MAX_STRING_LEN],dname[HUGE_STRING_LEN];
  72.  
  73. int translate_name(char *name, FILE *fd) {
  74.     register int x,l;
  75.     char w[MAX_STRING_LEN];
  76.     struct passwd *pw;
  77.  
  78.     getparents(name);
  79.  
  80.     for(x=0;x<num_v;x++) {
  81.         l=strlen(v[x].fake);
  82.         if(!strncmp(name,v[x].fake,l)) {
  83.             strsubfirst(l,name,v[x].real);
  84.             return REDIRECT_URL;
  85.         }
  86.     }
  87.  
  88.     for(x=0; x < num_a; x++) {
  89.         l=strlen(a[x].fake);
  90.         if(!strncmp(name,a[x].fake,l)) {
  91.             strsubfirst(l,name,a[x].real);
  92.             dirs_in_alias = count_dirs(a[x].real);
  93.             return(a[x].script);
  94.         }
  95.     }
  96.  
  97.     if((user_dir[0]) && (name[0] == '/') && (name[1] == '~')) {
  98.         strcpy(dname,&name[2]);
  99.         getword(w,dname,'/');
  100.         if(!(pw=getpwnam(w)))
  101.             die(NOT_FOUND,name,fd);
  102.         fake[0] = '/';
  103.         fake[1] = '~';
  104.         strcpy(&fake[2],w);
  105.         make_full_path(pw->pw_dir,user_dir,real);
  106.         add_alias(fake,real,STD_DOCUMENT);
  107.         strsubfirst(strlen(w) + 2,name,real);
  108.         return STD_DOCUMENT;
  109.     }
  110.     /* no alias, add document root */
  111.     strsubfirst(0,name,document_root);
  112.     return STD_DOCUMENT;
  113. }
  114.  
  115. void unmunge_name(char *name) {
  116.     register int x,l;
  117.  
  118.     l=strlen(document_root);
  119.     if(!strncmp(name,document_root,l)) {
  120.         strsubfirst(l,name,"");
  121.         if(!name[0]) {
  122.             name[0] = '/';
  123.             name[1] = '\0';
  124.         }
  125.         return;
  126.     }
  127.     for(x=0;x < num_a; x++) {
  128.         l=strlen(a[x].real);
  129.         if(!strncmp(name,a[x].real,l)) {
  130.             strsubfirst(l,name,a[x].fake);
  131.             if(!name[0]) {
  132.                 name[0] = '/';
  133.                 name[1] = '\0';
  134.             }
  135.             return;
  136.         }
  137.     }
  138. }
  139.